Background

Present-day environmental justice may reflect legacies of injustice in the past. The United States has a long history of racial segregation which is still visible. During the 1930s the Home Owners’ Loan Corporation (HOLC), as part of the New Deal, rated neighborhoods based on their perceived safety for real estate investment. Their ranking system, (A (green), B (blue), C (yellow), D (red)) was then used to block access to loans for home ownership. Colloquially known as “redlining”, this practice has had widely-documented consequences not only for community wealth, but also health.1 Redlined neighborhoods have less greenery2 and are hotter than other neighborhoods.3

Check out coverage by the New York Times.

A recent study found that redlining has not only affected the environments communities are exposed to, it has also shaped our observations of biodiversity.4 Community or citizen science, whereby individuals share observations of species, is generating an enormous volume of data. Ellis-Soto and co-authors found that redlined neighborhoods remain the most undersampled areas across 195 US cities. This gap is highly concerning, because conservation decisions are made based on these data.

Check out coverage by EOS.

Workflow Goals

This workflow will investigate the lasting impacts of the HOLC grading system on the city of Los Angeles by:

Data Descriptions

EJScreen

The United States Environmental Protection Agency’s Environmental Justice Screening and Mapping Tool is an effort to provide national data for advancing their goals and supporting others interested in environmental justice.

According to the US EPA website:

This screening tool and data may be of interest to community residents or other stakeholders as they search for environmental or demographic information. It can also support a wide range of research and policy goals. The public has used EJScreen in many different locations and in many different ways.

EPA is sharing EJScreen with the public:
- to be more transparent about how we consider environmental justice in our work,
- to assist our stakeholders in making informed decisions about pursuing environmental justice and,
- to create a common starting point between the agency and the public when looking at issues related to environmental justice.

EJScreen provides environmental and demographic information for the US at the Census tract and block group levels. Block group data has been downloaded, and stored locally, from the EPA site.

Mapping Inequality

A team of researchers, led by the Digital Scholarship Lab at the University of Richmond have digitized maps and information from the HOLC as part of the Mapping Inequality project.

This workflow uses maps of HOLC grade designations for Los Angeles via URL. Information on the data can be found here.5

Biodiversity observations

The Global Biodiversity Information Facility is the largest aggregator of biodiversity observations in the world. Observations typically include a location and date that a species was observed. This workflow will use bird observations in 2022.

Legacy of Redlining Workflow

1. Investigate the legacy of redlining in current environmental (in)justice

Import libraries and data

library(tidyverse)
library(sf)
library(plotly)
library(gt)

Since we are analyzing LA in this workflow, we will read in EJScreen data and filter to Los Angeles County in the same step so we have a much smaller dataset to start with.

# read in ejscreen data with direct filepath
la_county <- st_read("~/Documents/github/eds223-assignments/assignment-2-amandaherbst/data/EJSCREEN_2023_BG_StatePct_with_AS_CNMI_GU_VI.gdb/",
                    quiet = TRUE) %>% 
  # filter ejscreen to LA county
  filter(CNTY_NAME == "Los Angeles County")

Understanding present day environmental justice issues in LA

Wastewater Discharge

The wastewater discharge indicator in EJScreen assigns a score to each census block group based on the pollution and toxicity of nearby streams and rivers. LA has limited access to local clean water and often deals with extremely polluted water after a storm. Let’s visualize the wastewater discharge indicator for LA census block groups and add centroids for block groups that are above the 95th percentile of national values for wastewater discharge. (If this is taking too long, don’t run the ggplotly line, it is not necessary, just makes the map interactive.) If you want to save the output, uncomment the last line!

# map of LA
# color census block groups by wastewater discharge
# add centroid for block groups above 95th percentile

# filter la dataset for block groups above 95th percentile for wastewater dischare
top_percentile <- la_county %>% 
  filter(P_PWDIS > 95)

# make centroids for block groups above 95th percentile
top_percentile_centroids <- st_centroid(top_percentile)

# map LA county and color census blocks by waste water discharge
m1 <- ggplot() +
  geom_sf(data = la_county, aes(fill = PWDIS),
          lwd = 0.1,
          color = 'gray') +
  scale_fill_viridis_c(direction = -1) +
  # add above 95th percentile centroids
  geom_sf(data = top_percentile_centroids,
          color = 'magenta') +
  labs(x = "Longtitude",
       y = "Latitude",
       fill = "Wastewater discharge") +
  # choose x axis breaks so longitude is readable
  scale_x_continuous(breaks = c(-119, -118.6, -118.2, -117.8)) +
  theme_bw()

# make interactive to better see where the centroids are
ggplotly(m1)
# save plot in Outputs folder
#ggsave("la_wastewater_discharge.png", plot = m1, path = "../Outputs")

In numbers

Now let’s use EJScreen data to investigate demographic (% low income) and environmental (PM 2.5 and Superfund proximity) indicators.

We can calculate what percent of census block groups have less than 5% of the population considered low income by filtering to groups with a percent income less than 0.05. Each row corresponds to a block group so the percent can be calculated by dividing the number of rows of the filtered dataframe by the number of rows of the original dataframe * 100.

high_inc <- la_county %>% 
  # filter to block groups where % of low income is less than 0.05
  filter(LOWINCPCT < 0.05) %>% 
  # take the resulting number of rows and divide by the total number of block groups
  # multiply by 100 to get percent value
  nrow()/nrow(la_county) * 100

print(paste(round(high_inc,2), "% of LA census block groups have less than 5% of the population considered low income"))
## [1] "6.11 % of LA census block groups have less than 5% of the population considered low income"

We can calculate the percent of census block groups that are above the 80th percentile for Particulate Matter 2.5 AND above the 80th percentile for Superfund proximity in a similar way as above. First, the ejscreen data is filtered where the percentiles for PM 2.5 and Superfund proximity are both over 80, then those number of rows are divided by the number of rows of the original dataframe * 100.

# percent of census block groups that are above 80th percentile for both PM 2.5 and Superfund proximity
pm_sf <- la_county %>% 
  filter(P_PM25 > 80 & P_PNPL > 80) %>% 
  nrow() / nrow(la_county) * 100

print(paste(round(pm_sf,2), "% of LA census block groups are above the 80th percentile for both PM 2.5 and Superfund proximity"))
## [1] "17.36 % of LA census block groups are above the 80th percentile for both PM 2.5 and Superfund proximity"

LA redlining

Maps of HOLC grade designations for Los Angeles can be imported from the Mapping Inequality project via URL as an sf object and geometries are made valid with st_make_valid.

LA_redlining <- st_read("https://dsl.richmond.edu/panorama/redlining/static/citiesData/CALosAngeles1939/geojson.json",
                        quiet = TRUE) %>%
  st_make_valid()

We can explore the redlining data by plotting the historical boundaries in LA, indicating HOLC grade by color. If you want to save the output, uncomment the last line!

# plot redlining areas, color by HOLC Grade
m2 <- ggplot() +
  geom_sf(data = LA_redlining, aes(fill = grade)) +
  labs(x = "Longtitude",
       y = "Latitude",
       fill = "HOLC Grade") +
  theme_bw()

m2

# save map in Outputs folder
#ggsave("la_holc_census_block_grps.png", plot = m2, path = "../Outputs")

To investigate current conditions in historically redlined areas, we can find the number of census block groups that fall within areas with HOLC grades. First, the LA_redlining and la_county data are in different coordinate reference systems, so one is reprojected before continuing. Then, a spatial inner join can be performed between the two datasets so that the resulting dataset contains only census block groups that are within areas with a historic HOLC grade.

# check CRS!
st_crs(la_county) == st_crs(LA_redlining)
## [1] FALSE
# la_county is in EPSG:3857
# LA_redlinging is in EPSG:4326
# transfrom LA_redlining to same crs as la_county
LA_redlining3857 <- st_transform(LA_redlining, st_crs(la_county))

# block groups that have intersecting geometries as LA_redlining HOLC grades
# left = FALSE for an inner join
block_groups_holc_join <- st_join(x = la_county, y = LA_redlining3857, left = FALSE)
holc_block_grps <- nrow(block_groups_holc_join)

print(paste(holc_block_grps, "census block groups in LA fall within areas with HOLC grades"))
## [1] "6388 census block groups in LA fall within areas with HOLC grades"

Based on EJScreen data, we can now summarize current conditions in the census block groups that were within areas with a HOLC grade. We will group by HOLC grade to compare the conditions across areas that were historically graded A, B, C, and D. Let’s look at the average % low income, percentile for particulate matter 2.5, percentile for low life expectancy, and percentile for air toxics cancer risk. If you want to save the output, uncomment the last line!

# summary table of means grouped by grade
t1 <- block_groups_holc_join %>%
  st_drop_geometry() %>% 
  group_by(grade) %>% 
  summarise(low_inc_pct_avg = mean(LOWINCPCT, na.rm = TRUE),
            p_pm25_avg = mean(P_PM25, na.rm = TRUE),
            p_low_life_exp_avg = mean(P_LIFEEXPPCT, na.rm = TRUE),
            p_cancer_avg = mean(P_CANCER, na.rm = TRUE)) %>% 
  gt() %>% 
  tab_header(title = "Current EJ Conditions in LA by HOLC grade")

t1
Current EJ Conditions in LA by HOLC grade
grade low_inc_pct_avg p_pm25_avg p_low_life_exp_avg p_cancer_avg
A 0.1497511 72.16036 23.75982 44.00670
B 0.2420120 76.33898 37.42025 47.68659
C 0.3408981 78.81884 47.88017 54.55468
D 0.3919059 80.23700 53.03621 56.57589
NA 0.3581823 76.72973 50.12409 41.49324
# save table as image in Outputs folder
#gtsave(t1, "la_current_conditions_tbl.png", path = "../Outputs")

Based on the averages calculated, the HOLC grade for a census block group in LA appears to be indicative of the percent of the population that is low income, as well as the percentiles they fall within for environmental justice indicators. Groups with a grade of “A” had the lowest average percent of low income (15%), and had an average of the lowest percentiles, comparatively, for PM 2.5, low life expectancy, and air toxics cancer risk. In comparison, areas with a grade of “D” had the highest average percent of low income (39%) and had the highest average percentiles for PM 2.5, low life expectancy, and air toxics cancer risk.

Investigate the legacy of redlining in biodiversity observations

To add bird biodiveristy observations to the analysis, import citizen science bird observations from a direct filepath and select observations from the year 2022. With another spatial inner join between LA_redlining and la_birds_22 (after checking for matching CRS’s), filter for observations that fall within neighborhoods with HOLC grades.

# read in birds data
la_birds <- st_read("~/Documents/github/eds223-assignments/assignment-2-amandaherbst/data/gbif-birds-LA",
                    quiet = TRUE)

# filter birds to 2022
la_birds_22 <- la_birds %>% 
  filter(year == 2022)
# Check crs!
st_crs(la_birds_22) == st_crs(LA_redlining)
## [1] TRUE
# both EPSG:4326

Matching CRS’s means we can continue without having to reproject!

Once joined, the percent of bird observations within each redlining category can be calculated by grouping by HOLC grade, then dividing the number of observations in each grade by the total number of observations (number of rows in original joined dataframe). Visualize these percentages with a bar chart for readability. If you want to save the output, uncomment the last line!

# bird observations in neighborhoods with HOLC grades
# inner join using "left = FALSE"
holc_birds <- st_join(LA_redlining, la_birds_22, left = FALSE)

# total number of bird observations
tot_bird <- nrow(holc_birds)

# percent of bird observations by HOLC grade
holc_birds_pct <- holc_birds %>% 
  group_by(grade) %>% 
  summarize(bird_pct_obs = n()/tot_bird * 100) 


# plot % of bird observations by HOLC
p1 <- ggplot(data = holc_birds_pct) +
  geom_col(aes(x = grade, y = bird_pct_obs, fill = grade),
           show.legend = FALSE) +
  labs(x = "HOLC Grade",
       y = "% Bird Observations",
       title = "Bird Observations in Redlining Categories") +
  theme_bw()

p1 

#ggsave("bird_obs_by_holc_grade.png", plot = p1, path = "../Outputs")

Since Ellis-Soto and co-authors found that redlined neighborhoods remain the most undersampled areas across 195 US cities, it is surprising that the largest share of bird observations are in historically redlined areas of Los Angeles. This could potentially be a result of LA’s population skyrocketing since 1933 and consequently leading to gentrification of redlined neighborhoods.


  1. Gee, G. C. (2008). A multilevel analysis of the relationship between institutional and individual racial discrimination and health status. American journal of public health, 98(Supplement_1), S48-S56.↩︎

  2. Nardone, A., Rudolph, K. E., Morello-Frosch, R., & Casey, J. A. (2021). Redlines and greenspace: the relationship between historical redlining and 2010 greenspace across the United States. Environmental health perspectives, 129(1), 017006.↩︎

  3. Hoffman, J. S., Shandas, V., & Pendleton, N. (2020). The effects of historical housing policies on resident exposure to intra-urban heat: a study of 108 US urban areas. Climate, 8(1), 12.↩︎

  4. Ellis-Soto, D., Chapman, M., & Locke, D. H. (2023). Historical redlining is associated with increasing geographical disparities in bird biodiversity sampling in the United States. Nature Human Behaviour, 1-9.↩︎

  5. Robert K. Nelson, LaDale Winling, Richard Marciano, Nathan Connolly, et al., “Mapping Inequality,” American Panorama, ed. Robert K. Nelson and Edward L. Ayers, accessed October 17, 2023, https://dsl.richmond.edu/panorama/redlining/↩︎